package edu.erpan.bl.bean.administracion;

import java.util.List;

import javax.ejb.Remote;

import edu.erpan.bl.entities.administracion.Genero;
import edu.erpan.bl.entities.administracion.Modulo;
import edu.erpan.bl.entities.administracion.Persona;
import edu.erpan.bl.entities.administracion.Rol;
import edu.erpan.bl.entities.administracion.TipoIdentificacion;
import edu.erpan.bl.entities.administracion.Usuario;
import edu.erpan.util.entityManager.IGenericEntityManager;
import edu.erpan.util.entityManager.exceptions.PersistException;
import edu.erpan.util.entityManager.exceptions.QueryException;

@Remote
public interface UsuarioBeanRemote extends IGenericEntityManager<Usuario>  {

	/**
	 * Consulta un usuario dado su login name y su password
	 * 
	 * @param login
	 * @param password
	 * @return usuario
	 * @throws QueryException 
	 */
	Usuario consultarUsuario(String login, String password) throws QueryException;
	
	
	/**
	 * Consulta los roles que tiene asignado el usuario
	 * 
	 * @param usuario
	 * @return roles que posee el usuario
	 * @throws QueryException 
	 */
	List<Rol> consultarRolesUsuario(Usuario usuario) throws QueryException;


	/**
	 * Consulta los modulos que tiene el usuario por el rol seleccionado
	 * 
	 * @param usuario
	 * @param rol
	 * @return modulos
	 * @throws QueryException 
	 */
	Rol consultarRol(Rol rol) throws QueryException;


	/**
	 * Consulta de un modulo especifico
	 * 
	 * @param modulo
	 * @return
	 * @throws QueryException 
	 */
	Modulo consultarModulo(Modulo modulo) throws QueryException;
	
	/**
	 * Consulta las peronas que esten inscritas en el aplicativo, en caso de que el parametro activo sea nulo 
	 * se consultaran todas las personas independientemente de su estado
	 * 
	 * @param activo
	 * @return
	 * @throws QueryException
	 *
	 * @author Jeison
	 * @date 19/09/2012
	 */
	List<Persona> consultarPersonas(Boolean activo) throws QueryException;
	
	/**
	 * Consulta los usuarios asignados a una persona dentro del aplicativo
	 * 
	 * @return
	 *
	 * @author Jeison
	 * @date 20/02/2013
	 */
	List<Usuario> consultarUsuariosPersonas(Persona persona) throws QueryException;


	/**
	 * Consulta una persona del aplicativo dados los parametros de busqueda
	 * 
	 * @param persona
	 * @return
	 * @throws QueryException
	 *
	 * @author Jeison
	 * @date 20/02/2013
	 */
	Persona consultarPersona(Persona persona) throws QueryException;

	/**
	 * Permite persistir los datos de una persona
	 * 
	 * @param persona
	 * @throws PersistException
	 *
	 * @author Jeison
	 * @date 21/02/2013
	 */
	void guardarPersona(Persona persona) throws PersistException;

	/**
	 * Permite editar los datos de una persona
	 * 
	 * @param persona
	 * @throws PersistException
	 *
	 * @author Jeison
	 * @date 21/02/2013
	 */
	void editarPersona(Persona persona) throws PersistException;

	/**
	 * Permite persistir los datos de un usuario
	 * 
	 * @param usuario
	 * @throws PersistException
	 *
	 * @author Jeison
	 * @date 21/02/2013
	 */
	void guardarUsuario(Usuario usuario)  throws PersistException;

	/**
	 * Permite editar los datos de un usuario
	 * 
	 * @param usuario
	 * @throws PersistException
	 *
	 * @author Jeison
	 * @date 21/02/2013
	 */
	void editarUsuario(Usuario usuario) throws PersistException;


	/**
	 * Consulta todos los tipos de identificacion de las personas
	 * 
	 * @return
	 * @throws QueryException
	 *
	 * @author Jeison
	 * @date 4/03/2013
	 */
	List<TipoIdentificacion> consultarTiposIdentificacion() throws QueryException;
	
	/**
	 * Consulta los generos de las personas
	 * 
	 * @return
	 * @throws QueryException
	 *
	 * @author Jeison
	 * @date 5/03/2013
	 */
	List<Genero> consultarGeneros() throws QueryException;
}
